// Copyright (C) 2023 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

@import "../theme";

@mixin filled-color-scheme($intent-color, $text-color) {
  color: $text-color;
  background: $intent-color;

  &:hover {
    background: color_hover($intent-color);
  }

  &:active,
  &.pf-active {
    background: color_active($intent-color);
  }

  &[disabled] {
    &:hover {
      background: $intent-color;
    }

    &.pf-active {
      background: color_active($intent-color);
    }
  }
}

@keyframes pf-spinner-rotation {
  from {
    transform: rotate(0deg);
  }

  to {
    transform: rotate(360deg);
  }
}

.pf-button {
  font-family: var(--pf-font-compact);
  line-height: 1;
  user-select: none;
  border-radius: $border-radius;
  padding: 4px 8px;
  white-space: nowrap;
  min-width: max-content;
  position: relative;

  &--loading {
    // The button is unclickable when loading
    pointer-events: none;

    .pf-button__label,
    .pf-left-icon,
    .pf-right-icon {
      visibility: hidden;
    }

    &::after {
      content: "";
      height: 0.9em;
      width: 0.9em;
      border-radius: 100px;
      border-style: solid;
      border-width: 0.15em;
      border-color: var(--pf-color-border);
      border-top-color: var(--pf-color-primary);
      position: absolute;
      inset: 50%;
      translate: -50% -50%;
      animation: pf-spinner-rotation 1s infinite linear;
    }
  }

  &--shrink {
    min-width: 0;
    text-overflow: ellipsis;
    overflow: hidden;
  }

  &--rounded {
    border-radius: 100px;
  }

  & > .pf-left-icon {
    margin-right: 6px; // Make some room between the icon and label
  }

  & > .pf-right-icon {
    margin-left: 6px; // Make some room between the icon and label
  }

  &:focus-visible {
    @include focus;
  }

  // Reduce padding when compact
  &.pf-compact {
    padding: 2px 4px;
    & > .pf-left-icon {
      margin-right: 2px;
    }

    & > .pf-right-icon {
      margin-left: 2px;
    }
  }

  // Reduce padding when we are icon-only
  &.pf-icon-only {
    & > .pf-left-icon {
      margin: 0;
    }

    padding: 4px;

    &.pf-compact {
      padding: 0;
    }

    &::before {
      // Inserting a zero-width space to keep the button in flow. This allows it
      // to stay aligned with the baseline of other text around it.
      content: "\200B"; /* Zero-width space */
    }
  }

  &[disabled] {
    filter: opacity(50%);
    cursor: not-allowed;
  }

  // From here on in we just describe the colors
  &--filled {
    background: color-mix(
      in srgb,
      transparent,
      var(--pf-color-interactive-base) 10%
    );

    &:hover {
      background: color-mix(
        in srgb,
        transparent,
        var(--pf-color-interactive-base) 15%
      );
    }

    &.pf-active,
    &:active {
      background: color-mix(
        in srgb,
        transparent,
        var(--pf-color-interactive-base) 20%
      );
    }

    &[disabled] {
      &:hover {
        background: color-mix(
          in srgb,
          transparent,
          var(--pf-color-interactive-base) 10%
        ); // Reset to the default background
      }

      &.pf-active {
        background: color-mix(
          in srgb,
          transparent,
          var(--pf-color-interactive-base) 40%
        );
      }
    }

    &.pf-intent-primary {
      @include filled-color-scheme(
        var(--pf-color-primary),
        var(--pf-color-text-on-primary)
      );
    }

    &.pf-intent-success {
      @include filled-color-scheme(
        var(--pf-color-success),
        var(--pf-color-text-on-success)
      );
    }

    &.pf-intent-danger {
      @include filled-color-scheme(
        var(--pf-color-danger),
        var(--pf-color-text-on-danger)
      );
    }

    &.pf-intent-warning {
      @include filled-color-scheme(
        var(--pf-color-warning),
        var(--pf-color-text-on-warning)
      );
    }
  }

  &--outlined {
    border: solid 1px var(--pf-color-border);
  }

  &--minimal,
  &--outlined {
    &:hover {
      background: color_hover(transparent);
    }

    &:active,
    &.pf-active {
      background: color_active(transparent);
    }

    &.pf-intent-primary {
      color: var(--pf-color-primary);
    }

    &.pf-intent-success {
      color: var(--pf-color-success);
    }

    &.pf-intent-danger {
      color: var(--pf-color-danger);
    }

    &.pf-intent-warning {
      color: var(--pf-color-warning);
    }

    &[disabled] {
      &:hover {
        background: unset;
      }

      &.pf-active {
        background: color_active(transparent);
      }
    }
  }
}

.pf-button-bar {
  display: flex;
  flex-direction: row;
  gap: 2px;
  align-items: baseline;
}

.pf-button-group {
  display: flex;
  flex-direction: row;
  align-items: baseline;

  .pf-button:not(:last-child) {
    border-top-right-radius: unset;
    border-bottom-right-radius: unset;
    border-right: unset;
  }

  .pf-button:not(:first-child) {
    border-top-left-radius: unset;
    border-bottom-left-radius: unset;
  }
}
